import router from '@/router'
import { STORAGE_TOKEN_KEY } from '@/stores/mutation-type'
import type { AxiosError, InternalAxiosRequestConfig } from 'axios'
import axios from 'axios'
import { showNotify, showToast } from 'vant'

// 这里是用于设定请求后端时，所用的 Token KEY
// 可以根据自己的需要修改，常见的如 Access-Token，Authorization
// 需要注意的是，请尽量保证使用中横线`-` 来作为分隔符，
// 避免被 nginx 等负载均衡器丢弃了自定义的请求头
export const REQUEST_TOKEN_KEY = 'token'
export const LOCALE_KEY = 'locale'

export const API_BASE_URL = import.meta.env.DEV 
  ? import.meta.env.VITE_APP_API_BASE_URL 
  : window.location.origin
// 创建 axios 实例
const request = axios.create({
  // API 请求的默认前缀
  // baseURL: import.meta.env.VITE_APP_API_BASE_URL,
  baseURL:API_BASE_URL,
  timeout: 10000, // 请求超时时间
})

export type RequestError = AxiosError<{
  message?: string
  result?: any
  errorMessage?: string
}>

// 异常拦截处理器
function errorHandler(error: RequestError): Promise<any> {
  if (error.response) {
    const { data = {}, status, statusText } = error.response
    // 403 无权限
    if (status === 403) {
      showNotify({
        type: 'danger',
        message: (data && data.message) || statusText,
      })
    }
    // 401 未登录/未授权
    if (status === 401) {
      // 清除token
      localStorage.removeItem(STORAGE_TOKEN_KEY)
      localStorage.removeItem('userInfo')
     // 显示提示信息
      showToast({
        type: 'fail',
        message: '请重新登录',
        duration: 2000,
        forbidClick: true,
        onClose: () => {
          // 重定向到登录页
          router.replace('/login')
        }
      })
    }
  }
  return Promise.reject(error)
}

// 请求拦截器
function requestHandler(config: InternalAxiosRequestConfig): InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig> {
  // 从localStorage直接获取access_token
  const token = localStorage.getItem(STORAGE_TOKEN_KEY) || ''
  
  // 从localStorage获取用户信息以提取token（作为备用方案）
  let userToken = ''
  const userInfoStr = localStorage.getItem('userInfo')
  if (userInfoStr) {
    try {
      const userInfo = JSON.parse(userInfoStr)
      // 使用从userInfo中提取的token
      if (userInfo && userInfo.token) {
        userToken = userInfo.token
      }
    } catch (error) {
      console.error('解析用户信息失败:', error)
    }
  }

  // 从localStorage获取语言设置
  const appLanguage = (localStorage.getItem('language') || 'id-ID').split('-')[1]
  
  // 设置请求头
  if (token) {
    // 优先使用access_token
    config.headers[REQUEST_TOKEN_KEY] = token
    config.headers['Authorization'] = `Bearer ${token}`
    config.headers['token'] = `${token}`
  } else if (userToken) {
    // 备用：使用userInfo中的token
    config.headers[REQUEST_TOKEN_KEY] = userToken
    config.headers['Authorization'] = `Bearer ${userToken}`
    config.headers['token'] = `${token}`
  }
  
  // 设置语言请求头
  config.headers[LOCALE_KEY] = appLanguage

  return config
}

// Add a request interceptor
request.interceptors.request.use(requestHandler, errorHandler)

// 响应拦截器
function responseHandler(response: any) {
  const { data, config } = response
  const res = data

  // 检查未授权状态
  if (res && res.code === 401) {
    // 清除token
    localStorage.removeItem(STORAGE_TOKEN_KEY)
    localStorage.removeItem('userInfo')
    
    // 显示提示信息
    
    showToast(res.msg || 'Silakan log masuk lagi')
    router.replace('/login')
    
    return res
  }

  return res
}

// Add a response interceptor
request.interceptors.response.use(responseHandler, errorHandler)

export default request
